"""
CPM/Package: Описание минимальной еденицы - Пакета
Authro: Milinuri Nirvalen
Ver: 2.0
"""

from screen import Logger
from utils import check_params, print_dict, package_base
from config import Config

import os


log = Logger('Pac')


class Package:
    """Класс описания еденицы пакета.

    :param pid: Package iD
    :param data: Данные пакета
    :param data: Настройки CPM"""

    def __init__(self, pid, data={}, config={}):
        super(Package, self).__init__()
        self.pid = pid
        self.config = config
        
        # Дополняем недостающие пункты, если необходимо
        self.data = check_params(data, self.config.get("package_base", 
                                                       package_base))
        
        # Добавляем параметры пакета как аттрибуты плагина
        self.__dict__.update(self.data)

        self.find_another_params()

    def find_another_params(self):
        """Ищет параметры пакета, не указанные в package_base."""

        for k in self.data:
            if k not in package_base:
                log.warn(f'{self.pid}: "{k}" внещний параметр')

    def is_installed(self):
        """Проверяет установлен ли пакет в системе.
        Если какого-файла пакета не хватает, - пакет не установлен.

        В packages.toml можно больше одного пакета.
        Это рождает проблему фантомнывх пакетов.
        Установил один, помечаютсяя установленными все."""
        
        if not self.data['files']:
            log.warn(f'{self.pid} отцуцтвуют файлы пакета')
            return False

        for k in self.data['files']:
            if not os.path.isfile(k):
                log.warn(f'Отцуцтвует "{k}" -> {self.pid} не установлен')
                return False

        return True

    def get_file_hash(self, path):
        """Возвращает хеш файла пакета, если он записан."""
        return self.data.get('files', {}).get(path, '')

    def status(self, mini=False, desc=True):
        """Выводит краткую характеристику пакета.
        
        :param mini: Показывать ли сокращённую версию
        :param desc: Показывать ли описание пакета."""
        
        res = "  "

        # Принадлежность пакета к репозиторию
        if len(self.pid.split('.')) > 1:
            res += f"\033[95m{self.pid.split('.')[0]} "

        # PID пакета
        res += f"\033[93m{self.pid.split('.')[-1]}\033[90m"

        if mini:
            res += f'{self.ver}\033[0m '
            if desc:
                res += self.desc
        else:
            res += f' {self.name} \033[92m{self.ver} ({self.build})\033[0m'
            if desc:
                res += f'\n    {self.desc}'

        print(res)

    def print_params(self):
        """Выводит параметры пакета"""
        print_dict(self.data)

    def remove(self):
        """Удаляет всё файлы пакета."""

        for x in self.data["files"]:
            if x.rsplit('/', 1)[-1] == "packages.toml":
                if self.data["multiple"]:
                    continue

            os.remove(x)
            log.info(f"R: {x}")
        log.complite(f'{self.pid} файлы удалены')
